﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Entities;
using BLL.Validation;
using Utilities;
using System.Linq.Expressions;
using DAL;
using DAL.IRepository;

namespace BLL
{
    public class TaiKhoanManager:IValidator<TaiKhoan>
    {
        private readonly IGeneralRepository<TaiKhoan> _repository;

        public TaiKhoanManager(IGeneralRepository<TaiKhoan> itr)
        {
            _repository = itr;
        }
        public ValidationResult Validate(TaiKhoan tk)
        {
            var vResult = new ValidationResult();
            String USERNAME_PATTERN = "^[a-z_][a-z0-9_]{2,20}$";
            if (!StringExtension.Test(tk.Username, USERNAME_PATTERN))
            {
                vResult.Messages.Add("Tên đăng nhập phải bắt đầu bằng kí tự hoặc dấu gạch dưới\nTên đăng nhập phải có độ dài từ 3-20, chỉ bao gồm chữ cái, chữ số và kí tự gạch dưới");
                return vResult;
            }
            if (string.IsNullOrEmpty(tk.Username.Trim()))
                vResult.Messages.Add("Tên đăng nhập khác chuỗi rỗng");
            if (string.IsNullOrEmpty(tk.Password.Trim()))
              vResult.Messages.Add("Password phải khác chuỗi rỗng");
            return vResult;
           
        }
        public ActionResult InsertOrUpdate(TaiKhoan tk)
        {
            var aResult = new ActionResult();
            try
            {
                if (!_repository.InsertOrUpdate(tk))
                    aResult.Exceptions.Add(new Exception("Thêm mới tài khoản không thành công"));
            }
            catch (Exception ex)
            {
                aResult.Exceptions.Add(ex);
            }
            return aResult;
        }

        public ActionResult Delete(string user)
        {
            var aResult = new ActionResult();
            try
            {
                if (!_repository.Delete(t => t.Username == user))
                    aResult.Exceptions.Add(new Exception("Xóa thông tin tài khoản không thành công"));
            }
            catch (Exception ex)
            {
                aResult.Exceptions.Add(ex);
            }
            return aResult;
        }

        public ActionResultAsList<TaiKhoan> Find(Expression<Func<TaiKhoan, bool>> predicate)
        {
            var aResult = new ActionResultAsList<TaiKhoan>();
            try
            {
                aResult.Result = _repository.Find(predicate).ToList();
                if (aResult.Result.Count == 0)
                    aResult.Exceptions.Add(new Exception("Không tìm thấy tài khoản thỏa điều kiện"));
            }
            catch (Exception ex)
            {
                aResult.Exceptions.Add(ex);
            }
            return aResult;
        }
    }
}
